import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:crypto/crypto.dart';

/**
 * @Description: 获取大文件md5
 * @Author: 下雨了
 * @CreateDate: 2023年3月17日 14:08:41
 * @UpdateUser: 更新者
 * @UpdateDate:  2023年3月17日 14:08:45
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
///
class Md5FileUtils {
  // 私有构造函数
  Md5FileUtils._internal();

  // 保存单例
  static final Md5FileUtils _md5fileUtils = Md5FileUtils._internal();

  // 工厂构造函数
  factory Md5FileUtils() => _md5fileUtils;



  Future<String?> getFileHash(String filePath) async {
    final File file = File(filePath);
    if (!file.existsSync()) return null;
    int length = file.lengthSync();
    print("文件大小 = $length");
    // 当文件大于大于 100M时
    // if (length > 100 * 1024 *1024) {
    //   final sFile = await file.open();
    //
    //   try {
    //     final a = sFile.readSync(100 * 1024 * 1024);
    //     File b = File.fromRawPath(a);
    //     print(" 路径 =  $b.path");
    //   } finally {
    //     unawaited(sFile.close());
    //   }
    // } else {
      try {
        // 取文件的 0 - 20M 之间的数据
        final stream = file.openRead(0, 20 * 1024 * 1024);
        final hash = await md5.bind(stream).first;
        // NOTE: You might not need to convert it to base64
        // return base64.encode(hash.bytes);
        return hash.toString();
      } catch (exception) {
        return null;
      }
    // }
  }


}
